home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dspice0s / fetlim.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  3KB  |  149 lines

  1. /* fetlim.f -- translated by f2c (version of 3 February 1990  3:36:42).
  2.    You must link the resulting object file with the libraries:
  3.     -lF77 -lI77 -lm -lc   (in that order)
  4. */
  5.  
  6. #include "f2c.h"
  7.  
  8. /*<       subroutine fetlim(vnew,vold,vto) >*/
  9. /* Subroutine */ int fetlim_(vnew, vold, vto)
  10. doublereal *vnew, *vold, *vto;
  11. {
  12.     /* System generated locals */
  13.     doublereal d_1, d_2;
  14.  
  15.     /* Local variables */
  16.     static doublereal delv, vtox, vtemp, vtsthi, vtstlo;
  17.  
  18. /*<       implicit double precision (a-h,o-z) >*/
  19.  
  20. /*     this routine limits the per-iteration change of fet voltages. */
  21.  
  22.  
  23. /*      three regions of operation are identified: */
  24.  
  25. /*                  v < vto        definitely off */
  26. /*            vto <= v <= vto+3.5d0    off or on depending on vbs */
  27. /*        vto+3.5d0 < v              definitely on */
  28.  
  29. /*<       vtsthi=dabs(2.0d0*(vold-vto))+2.0d0 >*/
  30.     vtsthi = (d_1 = (*vold - *vto) * 2., abs(d_1)) + 2.;
  31. /*<       vtstlo=vtsthi/2.0d0+2.0d0 >*/
  32.     vtstlo = vtsthi / 2. + 2.;
  33. /*<       vtox=vto+3.5d0 >*/
  34.     vtox = *vto + 3.5;
  35. /*<       delv=vnew-vold >*/
  36.     delv = *vnew - *vold;
  37.  
  38. /*<       if (vold.lt.vto) go to 300 >*/
  39.     if (*vold < *vto) {
  40.     goto L300;
  41.     }
  42. /*<       if (vold.lt.vtox) go to 200 >*/
  43.     if (*vold < vtox) {
  44.     goto L200;
  45.     }
  46.  
  47. /*  on ... */
  48.  
  49. /*<       if (delv.gt.0.0d0) go to 120 >*/
  50.     if (delv > 0.) {
  51.     goto L120;
  52.     }
  53. /* ...  going off */
  54. /*<       if (vnew.lt.vtox) go to 110 >*/
  55.     if (*vnew < vtox) {
  56.     goto L110;
  57.     }
  58. /*<       if (-delv.le.vtstlo) go to 500 >*/
  59.     if (-delv <= vtstlo) {
  60.     goto L500;
  61.     }
  62. /*<       vnew=vold-vtstlo >*/
  63.     *vnew = *vold - vtstlo;
  64. /*<       go to 500 >*/
  65.     goto L500;
  66. /*<   110 vnew=dmax1(vnew,vto+2.0d0) >*/
  67. L110:
  68. /* Computing MAX */
  69.     d_1 = *vnew, d_2 = *vto + 2.;
  70.     *vnew = max(d_2,d_1);
  71. /*<       go to 500 >*/
  72.     goto L500;
  73. /* ...  staying on */
  74. /*<   120 if (delv.lt.vtsthi) go to 500 >*/
  75. L120:
  76.     if (delv < vtsthi) {
  77.     goto L500;
  78.     }
  79. /*<       vnew=vold+vtsthi >*/
  80.     *vnew = *vold + vtsthi;
  81. /*<       go to 500 >*/
  82.     goto L500;
  83.  
  84. /*  middle region ... */
  85.  
  86. /*<   200 if (delv.gt.0.0d0) go to 210 >*/
  87. L200:
  88.     if (delv > 0.) {
  89.     goto L210;
  90.     }
  91. /* ...  decreasing */
  92. /*<       vnew=dmax1(vnew,vto-0.5d0) >*/
  93. /* Computing MAX */
  94.     d_1 = *vnew, d_2 = *vto - .5;
  95.     *vnew = max(d_2,d_1);
  96. /*<       go to 500 >*/
  97.     goto L500;
  98. /* ...  increasing */
  99. /*<   210 vnew=dmin1(vnew,vto+4.0d0) >*/
  100. L210:
  101. /* Computing MAX */
  102.     d_1 = *vnew, d_2 = *vto + 4.;
  103.     *vnew = min(d_2,d_1);
  104. /*<       go to 500 >*/
  105.     goto L500;
  106.  
  107. /*  off ... */
  108.  
  109. /*<   300 if (delv.gt.0.0d0) go to 310 >*/
  110. L300:
  111.     if (delv > 0.) {
  112.     goto L310;
  113.     }
  114. /*<       if (-delv.le.vtsthi) go to 500 >*/
  115.     if (-delv <= vtsthi) {
  116.     goto L500;
  117.     }
  118. /*<       vnew=vold-vtsthi >*/
  119.     *vnew = *vold - vtsthi;
  120. /*<       go to 500 >*/
  121.     goto L500;
  122. /*<   310 vtemp=vto+0.5d0 >*/
  123. L310:
  124.     vtemp = *vto + .5;
  125. /*<       if (vnew.gt.vtemp) go to 320 >*/
  126.     if (*vnew > vtemp) {
  127.     goto L320;
  128.     }
  129. /*<       if (delv.le.vtstlo) go to 500 >*/
  130.     if (delv <= vtstlo) {
  131.     goto L500;
  132.     }
  133. /*<       vnew=vold+vtstlo >*/
  134.     *vnew = *vold + vtstlo;
  135. /*<       go to 500 >*/
  136.     goto L500;
  137. /*<   320 vnew=vtemp >*/
  138. L320:
  139.     *vnew = vtemp;
  140.  
  141. /*  finished */
  142.  
  143. /*<   500 return >*/
  144. L500:
  145.     return 0;
  146. /*<       end >*/
  147. } /* fetlim_ */
  148.  
  149.